﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using MySql.Data.MySqlClient;

namespace MakeIT.MiraPark.Negocios
{
    public static partial class ModelBO
    {

        public static PendenciaVO getPendencia(int idPendencia)
        {
            List<PendenciaVO> listaPendenciaVo = getPendencias(idPendencia, null, null, false, false, null, null);
            if (listaPendenciaVo != null && listaPendenciaVo.Count > 0)
                return listaPendenciaVo[0];
            else
                return null;
        }

        public static List<PendenciaVO> getPendencias()
        {
            return getPendencias(null, null, null, false, false, null, null);
        }

        public static List<PendenciaVO> getPendencias(int? idPendencia, int? idOperador, string placa, bool semDtPagamento, bool comDtPagamento, DateTime? dtPgtoIni, DateTime? dtPgtoFim)
        {
            string where1 = "WHERE ";
            string where = "";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT r.IdPendencia, r.Pendencia, r.IdOperador, r.Placa, r.DtPagamento, r.IdFormaPagamento, fp.FormaPagamento, r.Valor, r.ValorRec ");
            query.AppendLine("FROM pendencia r LEFT JOIN formapagamento fp ON r.IdFormaPagamento = fp.IdFormaPagamento ");

            if (idPendencia != null)
            {
                where1 += "r.IdPendencia=?IdPendencia ";
                where = "AND ";
            }
            if (idOperador != null)
            {
                where1 += where + "r.IdOperador=?IdOperador ";
                where = "AND ";
            }
            if (placa != null)
            {
                where1 += where + "r.Placa=?Placa ";
                where = "AND ";
            }
            if (semDtPagamento && comDtPagamento)
            {
                where1 += where + "r.DtPagamento is null ";
                where = "OR ( ";
                if (dtPgtoIni != null && dtPgtoFim != null)
                {
                    where1 += where + "r.DtPagamento BETWEEN DATE(?DtPgtoINI) AND DATE(?DtPgtoFIM) ) ";
                    where = "AND ";
                }
                else if (dtPgtoIni != null)
                {
                    where1 += where + "r.DtPagamento = DATE(?DtPgtoINI) ) ";
                    where = "AND ";
                }
                else if (dtPgtoFim != null)
                {
                    where1 += where + "r.DtPagamento = DATE(?DtPgtoFIM) ) ";
                    where = "AND ";
                }

            }
            else if (comDtPagamento)
            {
                where1 += where + "r.DtPagamento is not null ";
                where = "AND ";
                if (dtPgtoIni != null && dtPgtoFim != null)
                {
                    where1 += where + "r.DtPagamento BETWEEN DATE(?DtPgtoINI) AND DATE(?DtPgtoFIM) ";
                    where = "AND ";
                }
                else if (dtPgtoIni != null)
                {
                    where1 += where + "r.DtPagamento = DATE(?DtPgtoINI) ";
                    where = "AND ";
                }
                else if (dtPgtoFim != null)
                {
                    where1 += where + "r.DtPagamento = DATE(?DtPgtoFIM) ";
                    where = "AND ";
                }
            }
            else if (semDtPagamento)
            {
                where1 += where + "r.DtPagamento is null ";
            }

            if (where1.Length > 6)
                query.AppendLine(where1);

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (idPendencia != null) cmd.Parameters.AddWithValue("?IdPendencia", idPendencia);
            if (idOperador != null) cmd.Parameters.AddWithValue("?IdOperador", idOperador);
            if (placa != null) cmd.Parameters.AddWithValue("?Placa", placa);
            if (dtPgtoIni != null) cmd.Parameters.AddWithValue("?DtPgtoINI", dtPgtoIni);
            if (dtPgtoFim != null) cmd.Parameters.AddWithValue("?DtPgtoFIM", dtPgtoFim);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                List<PendenciaVO> listPendenciaVOs = new List<PendenciaVO>();

                while (reader.Read())
                {
                    PendenciaVO pendenciaVO = PendenciaVO.CreatePendenciaVO();
                    pendenciaVO.idPendencia = reader.GetInt32("IdPendencia");
                    pendenciaVO.pendencia = reader.GetString("Pendencia");
                    pendenciaVO.idOperador = reader.GetInt32("IdOperador");
                    pendenciaVO.placa = reader.GetString("Placa");
                    if (!reader.IsDBNull(reader.GetOrdinal("DtPagamento")))
                        pendenciaVO.dtPagamento = reader.GetDateTime("DtPagamento");
                    pendenciaVO.formaPagamentoVO.idFormaPagamento = reader.GetInt32("IdFormaPagamento");
                    if (!reader.IsDBNull(reader.GetOrdinal("FormaPagamento")))
                        pendenciaVO.formaPagamentoVO.formaPagamento = reader.GetString("FormaPagamento");
                    pendenciaVO.valor = reader.GetDecimal("Valor");
                    pendenciaVO.valorRec = reader.GetDecimal("ValorRec");

                    listPendenciaVOs.Add(pendenciaVO);
                }
                reader.Close();
                return listPendenciaVOs;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
 
        }

        public static void setPendencia(PendenciaVO pendenciaVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("UPDATE pendencia ");
            query.AppendLine("SET Pendencia=?Pendencia, IdOperador=?IdOperador, Placa=?Placa, DtPagamento=?DtPagamento, IdFormaPagamento=?IdFormaPagamento, Valor=?Valor, ValorRec=?ValorRec ");
            query.AppendLine("WHERE IdPendencia=?IdPendencia ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdPendencia", pendenciaVO.idPendencia);
            cmd.Parameters.AddWithValue("?Pendencia", pendenciaVO.pendencia);
            cmd.Parameters.AddWithValue("?IdOperador", pendenciaVO.idOperador);
            cmd.Parameters.AddWithValue("?Placa", pendenciaVO.placa);
            cmd.Parameters.AddWithValue("?DtPagamento", pendenciaVO.dtPagamento);
            cmd.Parameters.AddWithValue("?IdFormaPagamento", pendenciaVO.formaPagamentoVO.idFormaPagamento);
            cmd.Parameters.AddWithValue("?Valor", pendenciaVO.valor);
            cmd.Parameters.AddWithValue("?ValorRec", pendenciaVO.valorRec);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static long newPendencia(PendenciaVO pendenciaVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("INSERT INTO pendencia ");
            query.AppendLine("SET Pendencia=?Pendencia, IdOperador=?IdOperador, Placa=?Placa, DtPagamento=?DtPagamento, IdFormaPagamento=?IdFormaPagamento, Valor=?Valor, ValorRec=?ValorRec ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdPendencia", pendenciaVO.idPendencia);
            cmd.Parameters.AddWithValue("?Pendencia", pendenciaVO.pendencia);
            cmd.Parameters.AddWithValue("?IdOperador", pendenciaVO.idOperador);
            cmd.Parameters.AddWithValue("?Placa", pendenciaVO.placa);
            cmd.Parameters.AddWithValue("?DtPagamento", pendenciaVO.dtPagamento);
            cmd.Parameters.AddWithValue("?IdFormaPagamento", pendenciaVO.formaPagamentoVO.idFormaPagamento);
            cmd.Parameters.AddWithValue("?Valor", pendenciaVO.valor);
            cmd.Parameters.AddWithValue("?ValorRec", pendenciaVO.valorRec);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
                return cmd.LastInsertedId;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static void delPendencia(PendenciaVO pendenciaVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("DELETE FROM pendencia ");
            query.AppendLine("WHERE IdPendencia=?IdPendencia ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdPendencia", pendenciaVO.idPendencia);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }
    }
}
